import axios, { AxiosInstance, AxiosRequestConfig, AxiosResponse } from 'axios';
import { useUserStore } from '@/store/user';
import { useLoginModal } from '@/composables/useLoginModal';
import { requestQueue } from './requestQueue';
import router from '@/router/route';

// 创建axios实例
const axiosInstance: AxiosInstance = axios.create({
  // 开发环境使用代理路径，构建环境使用实际API地址
  baseURL: import.meta.env.MODE === 'development' ? '/api' : import.meta.env.VITE_API_BASE_URL,
  // baseURL:'http://1.13.173.62:80',
  timeout: 30000, // 请求超时时间
  headers: {
    'Content-Type': 'application/json',
  },
});

// 请求拦截器
axiosInstance.interceptors.request.use(
  // @ts-ignore
  (config: AxiosRequestConfig) => {
    // 在发送请求之前做些什么
    const userStore = useUserStore();
    // 添加token到请求头
    const token = userStore.token;
    if (token && config.headers) {
      config.headers['Authorization'] = `Bearer ${token}`;
      config.headers['Uid'] = userStore.user?.uid || '';
    }

    return config;
  },
  (error) => {
    // 对请求错误做些什么
    console.error('请求错误:', error);
    return Promise.reject(error);
  }
);

// 响应拦截器
axiosInstance.interceptors.response.use(
  (response: AxiosResponse) => {
    // 统一处理响应数据
    const { data } = response;
    if (data.code === 200) {
      return data;
    } else {
      const msgError = data.msg || '请求失败';
      // 处理业务错误
      console.error('业务错误:', msgError);
      const error = new Error(msgError);
      // 添加响应信息到错误对象，确保401错误能被正确识别
      (error as any).response = response;
      return Promise.reject(error);
    }
  },
  (error) => {
    // 对响应错误做点什么
    console.error('响应错误:', error);

    // 处理HTTP错误
    if (error.response) {
      const { status } = error.response;
      switch (status) {
        case 401:
          console.log('检测到401错误，开始处理...');

          // 未授权，清除token并跳转到登录页
          const userStore = useUserStore();
          userStore.logout();
          console.log('用户已登出');
          const { showModal } = useLoginModal();
          showModal();

          break;
        case 403:
          console.error('没有权限访问');
          break;
        case 404:
          console.error('请求的资源不存在');
          break;
        case 500:
          console.error('服务器内部错误');
          break;
        default:
          console.error('请求失败:', error.response.data?.message || '未知错误');
      }
    } else if (error.request) {
      console.error('网络错误，请检查网络连接');
    } else {
      console.error('请求配置错误:', error.message);
    }

    return Promise.reject(error);
  }
);

export default axiosInstance;
